package cn.wlinker.video.monitor.brand.hikversion.utils;

import cn.hutool.core.collection.CollUtil;
import cn.wlinker.video.monitor.brand.hikversion.create.net.HCNetTools;
import cn.wlinker.video.monitor.brand.hikversion.create.net.config.NetConfig;
import cn.wlinker.video.monitor.brand.hikversion.create.net.config.NetConfigList;
import cn.wlinker.video.monitor.domain.dto.MonitorDeviceDTO;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 海康网络设备缓存工具类
 *
 * @author gxsjx
 * @version 1.0
 * @date 2025/5/3
 * Copyright © wlinker.cn
 */
public class NetDeviceCacheUtils {


    /**
     * 海康网络设备缓存
     */
    private static final Map<String, NetConfig> NET_CONFIG_MAP = new HashMap<>();

    static {
        List<NetConfig> netConfigList = NetConfigList.getList();
        if (CollUtil.isNotEmpty(netConfigList)) {
            netConfigList.forEach(netConfig -> NET_CONFIG_MAP.put(netConfig.getCode(), netConfig));
        }
    }

    /**
     * 海康网络设备工具类缓存
     */
    private static final Map<String, HCNetTools> HC_NET_TOOLS_MAP = new HashMap<>();


    /**
     * 根据设备编号获取海康网络设备缓存
     *
     * @param monitorDeviceDTO
     * @return
     */
    public static NetConfig getNetConfig(MonitorDeviceDTO monitorDeviceDTO) {
        return getNetConfig(monitorDeviceDTO.getDeviceCode());
    }

    /**
     * 根据设备编号获取海康网络设备缓存
     *
     * @param deviceCode
     * @return
     */
    public static NetConfig getNetConfig(String deviceCode) {
        return NET_CONFIG_MAP.get(deviceCode);
    }

    /**
     * 根据设备编号获取海康网络设备工具类
     *
     * @param monitorDeviceDTO
     * @return
     */
    public static HCNetTools getHcNetTools(MonitorDeviceDTO monitorDeviceDTO) {
        return getHcNetTools(monitorDeviceDTO.getDeviceCode());
    }

    /**
     * 根据设备编号获取海康网络设备工具类
     *
     * @param deviceCode
     * @return
     */
    public static HCNetTools getHcNetTools(String deviceCode) {
        if (NET_CONFIG_MAP.get(deviceCode) == null) {
            throw new RuntimeException("nvr编号不存在:" + deviceCode);
        }
        HCNetTools hcNetTools = HC_NET_TOOLS_MAP.get(deviceCode);
        if (hcNetTools == null) {
            synchronized (deviceCode.intern()) {
                hcNetTools = HC_NET_TOOLS_MAP.get(deviceCode);
                if (hcNetTools != null) {
                    return hcNetTools;
                }
                hcNetTools = new HCNetTools();
                HC_NET_TOOLS_MAP.put(deviceCode, hcNetTools);
            }
        }
        return hcNetTools;
    }

}
